package com.xbongbong.saas.service;

import com.alibaba.fastjson.JSONObject;
import com.xbongbong.paas.domain.entity.ext.ConditionsEntityExt;
import com.xbongbong.paas.domain.entity.ext.PaasFormDataEntityExt;
import com.xbongbong.paas.pojo.dto.AddBatchDTO;
import com.xbongbong.paas.pojo.dto.FormDataAddDTO;
import com.xbongbong.paas.pojo.dto.PaymentTaskDataDTO;
import com.xbongbong.paas.pojo.dto.SaasFormSaveDTO;
import com.xbongbong.paas.pojo.dto.ValidateDataDTO;
import com.xbongbong.paas.pojo.vo.FormDataAddVO;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.pro.applist.pojo.vo.ListAppVO;
import com.xbongbong.pro.businessdata.pojo.dto.FormatExplainDTO;
import com.xbongbong.pro.detailtab.dto.LinkAddBeforeDTO;
import com.xbongbong.pro.detailtab.vo.DetailTabLinkAddBeforeVO;
import com.xbongbong.pro.formdata.pojo.dto.SaasAnalysisDataDTO;
import com.xbongbong.pro.formexplain.pojo.dto.HandlerExplainInLinkItemDTO;
import com.xbongbong.pro.paymenttask.pojo.dto.PaymentTaskDTO;
import com.xbongbong.pro.paymenttask.pojo.dto.PaymentTaskDeleteBatchDTO;
import com.xbongbong.pro.paymenttask.pojo.dto.PaymentTaskGetDTO;
import com.xbongbong.pro.paymenttask.pojo.vo.PaymentTaskDeleteBatchVO;
import com.xbongbong.pro.paymenttask.pojo.vo.PaymentTaskPlanDayListVO;
import com.xbongbong.pro.paymenttask.pojo.vo.PaymentTaskPlanVO;
import com.xbongbong.pro.paymenttask.pojo.vo.PaymentTaskStatisicsListVO;
import com.xbongbong.pro.paymenttask.pojo.vo.PaymentTaskVO;
import com.xbongbong.pro.weblist.pojo.dto.SaasBaseDTO;
import com.xbongbong.pro.weblist.pojo.vo.SpecialListFilterVO;

import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
 * @author: 汪腾伟
 * @date: 2020/7/29
 * @desrcption: 回款计划接口层
 * @version:1.0
 */
public interface PaymentTaskService {

    /**
     * 回款计划列表界面需要显示的范围筛选字段
     *
     * @param saasBaseDTO
     * @return
     * @throws XbbException
     */
    SpecialListFilterVO statusSearch(SaasBaseDTO saasBaseDTO) throws XbbException;

    /**
     * 保存回款计划之前需要做的一些操作，解析传过来的参数变成可以保存到es中的数据
     *
     * @param validateDataDTO
     */
    void beforeSave(ValidateDataDTO validateDataDTO) throws XbbException;

    /**
     * 保存完回款计划之后，需要进行消息推送以及定时消息推送，还需要保存执行人信息
     *
     * @param saasFormSaveDTO
     */
    void afterSave(SaasFormSaveDTO saasFormSaveDTO) throws XbbException;

    /**
     * 获取回款计划金额信息
     *
     * @param paymentTaskGetDTO
     * @return
     */
    PaymentTaskVO getPaymentTaskAmount(PaymentTaskGetDTO paymentTaskGetDTO) throws XbbException;

    /**
     * 获取回款计划列表信息
     *
     * @param paymentTaskGetDTO
     * @return
     */
    PaymentTaskPlanVO listPaymentTask(PaymentTaskGetDTO paymentTaskGetDTO) throws XbbException;

    /**
     * 设置状态筛选
     *
     * @param paymentTaskGetDTO 入参
     * @return 条件
     * @throws XbbException 异常
     */
    List<ConditionsEntityExt> setConditionList(PaymentTaskGetDTO paymentTaskGetDTO) throws XbbException;

    /**
     * 获取有回款计划的日期
     *
     * @param paymentTaskGetDTO
     * @return
     */
    PaymentTaskPlanDayListVO dayList(PaymentTaskGetDTO paymentTaskGetDTO) throws XbbException;

    /**
     * 当前日期回款计划统计
     *
     * @param paymentTaskGetDTO
     * @return
     */
    PaymentTaskStatisicsListVO statistics(PaymentTaskGetDTO paymentTaskGetDTO) throws XbbException;

    /**
     * 新增的时候需要对回款计划解释的处理
     *
     * @param formatExplainDTO
     */
    void formatAddExplain(FormatExplainDTO formatExplainDTO);

    /**
     * 编辑更新回款计划的时候需要限制系统给定字段不可编辑
     *
     * @param formatExplainDTO
     */
    void formatUpdateExplain(FormatExplainDTO formatExplainDTO);

    /**
     * 对一些关联数据的处理，客户、合同
     *
     * @param saasAnalysisDataDTO
     * @param result
     */
    void formatData(SaasAnalysisDataDTO saasAnalysisDataDTO, JSONObject result) throws XbbException;

    /**
     * 批量删除回款计划
     *
     * @param paymentTaskDeleteBatchDTO
     * @return
     */
    PaymentTaskDeleteBatchVO deleteBatch(PaymentTaskDeleteBatchDTO paymentTaskDeleteBatchDTO) throws XbbException, InterruptedException;

    /**
     * 回滚回款计划，从数据库查询出同步至es内
     *
     * @param dataIdList 回款计划中的主键id
     * @param corpid 公司id
     */
    void updateRollbackPaymentTask(Collection<Long> dataIdList, String corpid) throws XbbException;

    /**
     * 获取执行人信息
     *
     * @param paymentTaskGetDTO
     * @param conditionsEntityExtList
     * @return
     * @throws XbbException
     */
    Set<String> setTeamCondition(PaymentTaskGetDTO paymentTaskGetDTO,List<ConditionsEntityExt> conditionsEntityExtList) throws XbbException;

    /**
     * 返回适合APP展示的回款计划列表信息
     *
     * @param paymentTaskGetDTO
     * @param esEntities
     * @param totalCount
     * @return
     */
    ListAppVO formatPaymentTaskAppList(PaymentTaskGetDTO paymentTaskGetDTO, List<PaasFormDataEntityExt> esEntities, Integer totalCount) throws XbbException;

    /**
     * 关联新建回款计划
     *
     * @param handlerExplainInLinkItemDTO
     */
    void formatLinkAddExplain(HandlerExplainInLinkItemDTO handlerExplainInLinkItemDTO) throws XbbException;

    /**
     * 获取计划收款总额
     *
     * @param corpid
     * @param dataId
     * @return
     */
    List<PaasFormDataEntityExt> getPaymentTaskEsDataListByCustomerId(String corpid, Long dataId) throws XbbException;

    /**
     * 更新回款计划
     *
     * @param paymentTaskDataDTO
     * @throws XbbException
     */
    void updatePaymentTask(PaymentTaskDataDTO paymentTaskDataDTO) throws XbbException;

    /**
     * 对合同的回款计划进行格式的转化以及一些校验，这边的代码是直接重老的回款计划拷过来，该变量
     *
     * @param formDataAddDTO
     * @return
     */
    AddBatchDTO beforeSaveBatch(FormDataAddDTO formDataAddDTO) throws XbbException;

    /**
     * 回款计划
     * @throws XbbException
     */
    FormDataAddVO pay(PaymentTaskDTO payMentTaskDTO, SaasFormSaveDTO saasFormSaveDTO) throws XbbException;

    /**
     * 已核销、预收款核销、坏账完成回款计划处理
     * @param data 回款单data
     * @param corpid 公司id
     * @return java.util.List<java.lang.Long> 返回要完成的回款计划id集合
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    List<Long> finishPaymentTask(JSONObject data, String corpid) throws XbbException;

    /**
     * 直接完成回款计划
     *
     * @param linkAddBeforeDTO
     * @return
     */
    DetailTabLinkAddBeforeVO updatePaymentTaskStatus(LinkAddBeforeDTO linkAddBeforeDTO) throws XbbException;

    /**
     * 一致性同步，使客户名称修改之后，回款计划中的客户名称也能修改
     *
     * @param corpid 公司id
     * @param dataId 客户id
     * @param name 客户名称
     */
    void dataConsistencyUpdateCustomer(String corpid, Long dataId, String name);

    /**
     * 一致性同步，使合同编号修改之后，回款计划中的合同编号也能修改
     *
     * @param corpid 公司id
     * @param dataId 合同id
     * @param serialNo 合同编号
     */
    void dataConsistencyUpdateContract(String corpid, Long dataId, String serialNo);

    /**
     * 获取封装得时间参数得共用的方法
     *
     * @param paymentTaskGetDTO
     * @return
     * @throws XbbException
     */
    List<ConditionsEntityExt> getReturnDateCondition(PaymentTaskGetDTO paymentTaskGetDTO) throws XbbException;
}
